package com.szgz.platform.service;

import com.szgz.platform.model.User;
import com.szgz.platform.model.UserEnvironment;
import com.szgz.platform.model.UserResource;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;

import java.util.List;
import java.util.Optional;
import java.util.Set;

/**
 * 用户管理服务接口
 * 提供用户环境创建、管理和资源隔离功能
 */
public interface UserManagementService {
    
    /**
     * 创建新用户
     * @param user 用户信息
     * @return 创建的用户
     */
    User createUser(User user);
    
    /**
     * 为用户创建隔离环境
     * @param userId 用户ID
     * @param userRole 用户角色
     * @return 用户环境信息
     */
    UserEnvironment createUserEnvironment(String userId, String userRole);
    
    /**
     * 为用户创建指定类型的隔离环境
     * @param userId 用户ID
     * @param userRole 用户角色
     * @param environmentTypes 环境类型集合
     * @return 用户环境信息
     */
    UserEnvironment createUserEnvironment(String userId, String userRole, Set<UserEnvironment.EnvironmentType> environmentTypes);
    
    /**
     * 启动用户环境
     * @param userId 用户ID
     * @return 是否成功
     */
    boolean startUserEnvironment(String userId);
    
    /**
     * 停止用户环境
     * @param userId 用户ID
     * @return 是否成功
     */
    boolean stopUserEnvironment(String userId);
    
    /**
     * 删除用户环境
     * @param userId 用户ID
     * @return 是否成功
     */
    boolean deleteUserEnvironment(String userId);
    
    /**
     * 获取用户环境状态
     * @param userId 用户ID
     * @return 环境状态
     */
    UserEnvironment getUserEnvironmentStatus(String userId);
    
    /**
     * 获取用户资源使用情况
     * @param userId 用户ID
     * @return 资源使用信息
     */
    UserResource getUserResourceUsage(String userId);
    
    /**
     * 备份用户数据
     * @param userId 用户ID
     * @return 备份文件路径
     */
    String backupUserData(String userId);
    
    /**
     * 恢复用户数据
     * @param userId 用户ID
     * @param backupPath 备份文件路径
     * @return 是否成功
     */
    boolean restoreUserData(String userId, String backupPath);
    
    /**
     * 获取所有用户列表
     * @return 用户列表
     */
    List<User> getAllUsers();
    
    /**
     * 根据ID查找用户
     * @param userId 用户ID
     * @return 用户信息
     */
    Optional<User> findUserById(String userId);
    
    /**
     * 更新用户信息
     * @param user 用户信息
     * @return 更新后的用户
     */
    User updateUser(User user);
    
    /**
     * 删除用户
     * @param userId 用户ID
     * @return 是否成功
     */
    boolean deleteUser(String userId);
    
    /**
     * 检查用户环境是否存在
     * @param userId 用户ID
     * @return 是否存在
     */
    boolean isUserEnvironmentExists(String userId);
    
    /**
     * 获取用户环境访问信息
     * @param userId 用户ID
     * @return 访问信息
     */
    UserEnvironment getAccessInfo(String userId);
    
    /**
     * 重置用户密码
     * @param userId 用户ID
     * @param newPassword 新密码
     * @return 是否成功
     */
    boolean resetUserPassword(String userId, String newPassword);
    
    /**
     * 限制用户资源使用
     * @param userId 用户ID
     * @param resourceLimits 资源限制
     * @return 是否成功
     */
    boolean setUserResourceLimits(String userId, UserResource resourceLimits);
    
    /**
     * 获取系统资源使用统计
     * @return 系统资源统计
     */
    UserResource getSystemResourceUsage();
    
    /**
     * 创建随机用户
     * @param role 用户角色
     * @return 创建的用户
     */
    User createRandomUser(String role);
    
    /**
     * 批量创建随机用户
     * @param count 创建数量
     * @param role 用户角色
     * @return 创建的用户列表
     */
    List<User> createRandomUsersBatch(int count, String role);

    /**
     * 创建共享 IDE 环境（单容器多进程，多用户目录隔离）
     * @param groupId 分组/课堂ID
     * @param studentIds 学生ID列表
     * @return 共享环境信息与各学生访问入口
     */
    java.util.Map<String, Object> createSharedIDEEnvironment(String groupId, java.util.List<String> studentIds);

    /**
     * 删除共享 IDE 环境
     */
    java.util.Map<String, Object> deleteSharedIDEEnvironment(String groupId);

    /**
     * 获取共享 IDE 的端口映射
     */
    java.util.Map<String, Integer> getSharedIDEPorts(String groupId);

    /**
     * 生成 Nginx 配置，将多端口映射到单域名路径
     */
    String generateSharedIDENginxConfig(String groupId, String serverName, String basePath);

    /**
     * 获取所有共享IDE环境
     * @return 共享IDE环境列表
     */
    java.util.List<com.szgz.platform.model.SharedIDEEnvironment> getAllSharedIDEEnvironments();

    /**
     * 根据组ID获取共享IDE环境
     * @param groupId 组ID
     * @return 共享IDE环境
     */
    com.szgz.platform.model.SharedIDEEnvironment getSharedIDEEnvironmentByGroupId(String groupId);

    /**
     * 使用 JupyterHub 创建共享多用户环境，并为所选学生创建账号
     */
    java.util.Map<String, Object> createSharedJupyterHubEnvironment(String groupId, java.util.List<String> studentIds);

    /** 删除共享 JupyterHub 环境 */
    java.util.Map<String, Object> deleteSharedJupyterHubEnvironment(String groupId);

    /**
     * 通用：删除共享环境（同时尝试 IDE 与 JupyterHub）
     */
    java.util.Map<String, Object> deleteSharedEnvironment(String groupId);

    /**
     * 创建共享 MySQL 环境：单一 MySQL 容器 + 为每位学生创建独立账户与默认数据库
     */
    java.util.Map<String, Object> createSharedMySQLEnvironment(String groupId, java.util.List<String> studentIds);

    /** 删除共享 MySQL 环境 */
    java.util.Map<String, Object> deleteSharedMySQLEnvironment(String groupId);

    /**
     * 学生分页查询（基于高校字段筛选）
     */
    Page<User> pageStudents(long pageNum, long pageSize,
                            String schoolName,
                            String collegeName,
                            String majorName,
                            String className,
                            String grade,
                            String studentNo,
                            String realName);
} 